#ifndef CENTER_JSON_HPP
#define CENTER_JSON_HPP

#include <jsoncpp/json/json.h>
#include <string>
#include <iostream>
#include <memory> 

namespace center_detection{

    class CenterJsonConverter
    {
    public:
        CenterJsonConverter(){}
        ~CenterJsonConverter(){}
        
        double coord_x, coord_y, coord_z;  

        std::string json_msg;

        // 设置坐标值
        void set_from_coord(double cx, double cy, double cz);

        // 生成并返回JSON字符串
        std::string get_json_string() const;

        // 从JSON字符串解析数据
        bool parse_json_string(const std::string& json_str);

        // 获取当前存储的JSON消息
        const std::string& get_json_msg() const { return json_msg; }


        // 获取坐标值
        double get_coord_x() const { return coord_x; }
        double get_coord_y() const { return coord_y; }
        double get_coord_z() const { return coord_z; }

        
    };


    inline void CenterJsonConverter::set_from_coord(double cx, double cy, double cz)
    {
        coord_x = cx;
        coord_y = cy;
        coord_z = cz;
    }


    inline std::string CenterJsonConverter::get_json_string() const 
    {

        Json::Value json_val;
        json_val["coord_x"] = coord_x;
        json_val["coord_y"] = coord_y;
        json_val["coord_z"] = coord_z;

        Json::StreamWriterBuilder builder;
        builder["indentation"] = ""; // 紧凑格式
        std::string result = Json::writeString(builder, json_val);

        return result;
        
    }

    inline bool CenterJsonConverter::parse_json_string(const std::string& json_str)
    {
        Json::Value json_val;
        Json::CharReaderBuilder reader_builder;
        std::string errors;

        std::unique_ptr<Json::CharReader> reader(reader_builder.newCharReader());
        
        if (!reader->parse(json_str.c_str(), json_str.c_str() + json_str.length(), &json_val, &errors)) {
            std::cerr << "JSON parse error: " << errors << std::endl;
            return false;
        }

        try {
            coord_x = json_val["coord_x"].asDouble();
            coord_y = json_val["coord_y"].asDouble();
            coord_z = json_val["coord_z"].asDouble();
            
            // 更新json_msg
            json_msg = json_str;
            return true;
        } 
        catch (const std::exception& e) {
            std::cerr << "Error accessing JSON values: " << e.what() << std::endl;
            return false;
        }
    }
}



#endif